package com.zp.self.module.level_4_算法练习.数据结构.String;

import org.junit.Test;

/**
 * @author By ZengPeng
 */
public class 力扣_796_旋转字符串 {
    @Test
    public void main() {

        System.out.println(rotateString("abcde","cdeab"));
        System.out.println(rotateString("abcde","abced"));
    }

    /**
    题目：给定两个字符串, s 和 goal。如果在若干次旋转操作之后，s 能变成 goal ，那么返回 true 。
         s 的 旋转操作 就是将 s 最左边的字符移动到最右边。 
         例如, 若 s = 'abcde'，在旋转一次之后结果就是'bcdea' 。

     示例 1:
     输入: s = "abcde", goal = "cdeab"
     输出: true

     示例 2:
     输入: s = "abcde", goal = "abced"
     输出: false

    分析：【P 💔💔】
       1.双重for循环，找到第一个字符相等时，进行比较，错误弹出，继续向下寻找  -- 时间复杂度O(n*n)
                    --执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户
                    --时长：9分钟
       三叶大神：如果 goal 可由 s 经过多步旋转而来，那么 goal 必然会出现在 s + s 中，即满足 (s + s).contains(goal) -- 时间复杂度O(n+n)
                contains 的时间复杂读 < O(n*n) ,说是JVM的indexOf有优化  ?  【待查证】

    边界值 & 注意点：
       1.
     **/
    public boolean rotateString(String s, String goal) {
        char[] chars = s.toCharArray(),charsGoal = goal.toCharArray();
        int sLength =chars.length,gLength=charsGoal.length;
        if(sLength!=gLength)
            return false;
        for (int j = 0; j < gLength; j++) {
            if(chars[0] == charsGoal[j]){
                //进行循环比较
                int left=1,right=j+1;
                while (right!=j){
                    if(right==gLength)
                        right=0;
                    if(chars[left]!= charsGoal[right++])
                        break;
                    left++;
                }
                if(left==sLength)
                    return true;
            }
        }
        return false;
    }
}
